Fix smp_processor_id to be linked to correct processor id under vcpu, which is
authordjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Wed, 21 Dec 2005 14:40:16 +0000 (08:40 -0600)
committerdjm@kirby.fc.hp.com <djm@kirby.fc.hp.com>
Wed, 21 Dec 2005 14:40:16 +0000 (08:40 -0600)
the exact one updated by scheduler. Or else easy to think how things get
messed under SMP environment. One phenomenon observed is about softirq.
Exit path on CPU1 checks pending indicator by local_cpu_data, and then
goto do_softirq if pending true. However do_softirq uses cpu_data(cpu)
to query pending bit again. Cpu index is aquired from smp_processor_id,
with thread_info->cpu not cared by scheduler. Finally do_softirq on CPU1
tries to operate percpu data on CPU0 then.

Also disable several prints within critical path, like sending IPI. Due to
slow serial speed, this will slow down overall performance heavily since
event channels among CPUs are in traffic.

This patch is necessary for host SMP.

Signed-off-by Kevin Tian <kevin.tian@intel.com>

xen/arch/ia64/linux-xen/irq_ia64.c
xen/arch/ia64/linux-xen/smp.c
xen/arch/ia64/vmx/vmx_irq_ia64.c
xen/include/asm-ia64/config.h

index c036ed08ee28b44db4bdec0177be33c396bac67c..346de4c1673060630140ab8f5e79c810f6ef762f 100644 (file)
@@ -282,7 +282,7 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
        ipi_addr = ipi_base_addr + ((phys_cpu_id << 4) | ((redirect & 1) << 3));
 
 #ifdef XEN
-       printf ("send_ipi to %d (%x)\n", cpu, phys_cpu_id);
+       //printf ("send_ipi to %d (%x)\n", cpu, phys_cpu_id);
 #endif
        writeq(ipi_data, ipi_addr);
 }
index bc8efb0ce621779e72228c346e22a58bb54877ba..97f66a045c5a893f5bd3272bf80e9092d0f19cf4 100644 (file)
@@ -73,7 +73,7 @@ void smp_send_event_check_mask(cpumask_t mask)
     if (cpus_empty(mask))
         return;
 
-    printf("smp_send_event_check_mask called\n");
+    //printf("smp_send_event_check_mask called\n");
 
     for (cpu = 0; cpu < NR_CPUS; ++cpu)
         if (cpu_isset(cpu, mask))
index 0bceaa82fd9ed07e3307ef2fab086777791c64c5..331ad83d1e5c4a7712db9cbb3891f42e049997b8 100644 (file)
@@ -117,9 +117,6 @@ vmx_ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
                local_irq_disable();
                ia64_setreg(_IA64_REG_CR_TPR, saved_tpr);
            }
-           else {
-                printf("Oops: RESCHEDULE IPI absorbed by HV\n");
-            }
            ia64_eoi();
            vector = ia64_get_ivr();
        }
index 53c29dbeb9d37d29439e7ed7498ddfd8eecb11cb..4d730b4b1a7a6be5a4207285f0e8216590a399ee 100644 (file)
@@ -300,7 +300,7 @@ extern int ht_per_core;
 
 // needed for include/xen/smp.h
 #ifdef CONFIG_SMP
-#define __smp_processor_id()   current_thread_info()->cpu
+#define __smp_processor_id()   current->processor
 #else
 #define __smp_processor_id()   0
 #endif